#include "timer_pwm.h"

void TIM3_Int_Init(void)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能定时器3时钟

	// 定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = 1000;					// 设置在下一个更新事件装入活动的自动重载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler = 36000;				// 设置用来作为TIM3时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;		// 设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);				// 根据指定的参数初始化TIM3的事件基数单位

	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 使能指定的TIM3中断，允许更新中断

	// 中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;			  // 使能TIM3外部中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 外部中断通道的抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		  // 子优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			  // 使能IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);							  // 初始化NVIC寄存器

	TIM_Cmd(TIM3, ENABLE); // 使能TIM3
}

void TIM3_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) // 检查TIM3更新中断发生与否
	{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清楚TIM3更新中断标志
		LED1 = !LED1;
		LED2 = !LED2;
	}
}

void TIM3_PWM_Init(uint16_t tim_arr)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);						// 使能定时器3时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); // 使能GPIO外设和AFIO复用功能模块时钟
	GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);						// 部分重映射 TIM3_CH2->PB5

	// 定时器TIM3初始化
	//(1000*72000)/72=1000000(us(微秒))
	TIM_TimeBaseStructure.TIM_Period = tim_arr;					// 设置在下一个更新事件装入活动的自动重载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler = 72 - 1;				// 设置用来作为TIM3时钟频率除数的预分频值  、
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;		// 设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);				// 根据指定的参数初始化TIM3的事件基数单位

	// 初始化TIM3 Channel3(通道2)  PWM模式
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;			  // 选择定时器模式:TIM脉冲跨度调制模式1
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;	  // 输出极性:
	TIM_OCInitStructure.TIM_Pulse = 50;							  // 占空比
	TIM_OC2Init(TIM3, &TIM_OCInitStructure);
	
	TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);	//使能TIM3在CCR2上的预装载寄存器

	TIM_Cmd(TIM3, ENABLE); // 使能TIM3
}

void LED1_PWM_Control(u16 pulse)
{
	TIM_SetCompare2(TIM3, pulse);
}
